Skip to content

Latest commit

 

History

History
131 lines (87 loc) · 3.07 KB

Observer.md

File metadata and controls

131 lines (87 loc) · 3.07 KB

#观察者模式

#####前言: 观察者模式又名(发布者/订阅者模式),顾名思义,我可以观察你,监视你,你的一举一动我了如指掌。你也可以发布消息,一条广播出来,所有收听你节目的观众都能收到你的消息。程序就是现实生活的抽象,通常一个系统中会涉及到多个不同模块之间会有相互关联,比如当一个模块A完成某种操作以后,其他模块B,C,D就要做出相应的响应。这种方式就可以使用观察者模式来实现。

#####应用场景 1.tomcat的生命周期管理: tomcat整个系统有非常多的组件构成。当tomcat启动的时候,就需要利用这种设计,通知其他所有注册的组件一并启动。
2.消息队列的实现:生产者将消息加入队列,通知特定主体的消费者从队列中获取消息。
3.文件系统的设计:当删除或增加一个文件的时候,文件目录,资源管理器等都会做出相应的改变。

#####类图

#####代码实现:

1.首先定义一个首先主体类:

public abstract class Subject {

	
	private ArrayList<Observer> list = new ArrayList<Observer>(); 
	
	public void registerObserver(Observer observer) {
		
		if (observer != null) {
			list.add(observer);
		}
	}
	
	public void removeObserver(Observer observer) {
		list.remove(observer);
	}
	
	public void nodify(Object obj) {
		for (Observer observer : list) {
			observer.update(obj);
		}
	}
}

2.然后定义抽象主题类的实现类,这个类就是具体被观察的对象,他的一举一动都可以调用nodify通知观察者

package com.demo.observer;

public class ContreteSubject extends Subject{

	public void todo() {
		System.out.println("我是被观察者!");
		nodify("通知:明天放假");
	}
}

3.接下来定义抽象观察者,这个类只提供一个统一的update接口,所有观察者都需要实现这个方法,并执行具体的业务。

public interface Observer {

	public void update(Object obj);
}

4.最后实现具体的观察者类

public class WatcherA implements Observer {
	
	@Override
	public void update(Object obj) {
		System.out.println("我是观察者A:  "+obj.toString());
	}
	
}

public class WatcherB implements Observer {

	@Override
	public void update(Object obj) {
		System.out.println("我是观察者B:  "+obj.toString());
	}

}

public class WatcherC implements Observer {

	@Override
	public void update(Object obj) {
		System.out.println("我是观察者C:  "+obj.toString());
	}

}

5.测试

public class Client {

	public static void main(String[] args) {
		
		ContreteSubject sub = new ContreteSubject();
		WatcherA a = new WatcherA();
		sub.registerObserver(a);
		sub.registerObserver(new WatcherA());
		sub.registerObserver(new WatcherB());
		sub.registerObserver(new WatcherC());

		sub.todo();
	}

}
我是被观察者!
我是观察者A:  通知:明天放假
我是观察者A:  通知:明天放假
我是观察者B:  通知:明天放假
我是观察者C:  通知:明天放假